package com.sojson.annotation.factory;

import java.lang.annotation.Annotation;
import java.math.BigDecimal;

import com.sojson.annotation.Excel;
import com.sojson.annotation.Excel.ColumnType;
import com.sojson.annotation.Excel.Type;

/**
 * {@link com.sojson.annotation.Excel}工厂
 * 
 * @author liu
 * @date 2021-09-10
 */
public class ExcelFactory {

    /** Excel的Class对象 */
    private static final Class<Excel> CLA = Excel.class;
    /** 导出时在excel中排序 */
    public static final int SORT = Integer.MAX_VALUE;
    /** 导出到Excel中的名字 */
    public static final String NAME = "";
    /** 日期格式, 如: yyyy-MM-dd */
    public static final String DATE_FORMAT = "";
    /** 如果是字典类型，请设置字典的type值 (如: sys_user_sex) */
    public static final String DICT_TYPE = "";
    /** 读取内容转表达式 (如: 0=男,1=女,2=未知) */
    public static final String READ_CONVERTER_EXP = "";
    /** 分隔符,读取字符串组内容 */
    public static final String SEPARATOR = ",";
    /** BigDecimal 精度 默认: -1(默认不开启BigDecimal格式化) */
    public static final int SCALE = -1;
    /** BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN */
    public static final int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;
    /** 导出类型(0数字 1字符串) */
    public static final ColumnType CELL_TYPE = ColumnType.STRING;
    /** 导出时在excel中每个列的高度 单位为字符 */
    public static final double HEIGHT = 14;
    /** 导出时在excel中每个列的宽 单位为字符 */
    public static final double WIDTH = 16;
    /** 文字后缀,如% 90 变成90% */
    public static final String SUFFIX = "";
    /** 当值为空时,字段的默认值 */
    public static final String DEFAULT_VALUE = "";
    /** 提示信息 */
    public static final String PROMPT = "";
    /** 设置只能选择不能输入的列内容. */
    public static final String[] COMBO = {};
    /** 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写 */
    public static final boolean IS_EXPORT = true;
    /** 另一个类中的属性名称,支持多级获取,以小数点隔开 */
    public static final String TARGET_ATTR = "";
    /** 是否自动统计数据,在最后追加一行统计数据总和 */
    public static final boolean IS_STATISTICS = false;
    /** 字段类型(0:导出导入,1：仅导出,2:仅导入) */
    public static final Type TYPE = Type.ALL;

    /** 导出时在excel中排序 */
    private int sort = SORT;
    /** 导出到Excel中的名字 */
    private String name = NAME;
    /** 日期格式, 如: yyyy-MM-dd */
    private String dateFormat = DATE_FORMAT;
    /** 如果是字典类型，请设置字典的type值 (如: sys_user_sex) */
    private String dictType = DICT_TYPE;
    /** 读取内容转表达式 (如: 0=男,1=女,2=未知) */
    private String readConverterExp = READ_CONVERTER_EXP;
    /** 分隔符,读取字符串组内容 */
    private String separator = SEPARATOR;
    /** BigDecimal 精度 默认: -1(默认不开启BigDecimal格式化) */
    private int scale = SCALE;
    /** BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN */
    private int roundingMode = ROUNDING_MODE;
    /** 导出类型(0数字 1字符串) */
    private ColumnType cellType = CELL_TYPE;
    /** 导出时在excel中每个列的高度 单位为字符 */
    private double height = HEIGHT;
    /** 导出时在excel中每个列的宽 单位为字符 */
    private double width = WIDTH;
    /** 文字后缀,如% 90 变成90% */
    private String suffix = SUFFIX;
    /** 当值为空时,字段的默认值 */
    private String defaultValue = DEFAULT_VALUE;
    /** 提示信息 */
    private String prompt = PROMPT;
    /** 设置只能选择不能输入的列内容. */
    private String[] combo = COMBO;
    /** 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写 */
    private boolean isExport = IS_EXPORT;
    /** 另一个类中的属性名称,支持多级获取,以小数点隔开 */
    private String targetAttr = TARGET_ATTR;
    /** 是否自动统计数据,在最后追加一行统计数据总和 */
    private boolean isStatistics = IS_STATISTICS;
    /** 字段类型(0:导出导入,1：仅导出,2:仅导入) */
    private Type type = TYPE;

    public ExcelFactory(String name) {
        this.name = name;
    }

    /** 获取 导出时在excel中排序 */
    public int getSort() {
        return sort;
    }

    /** 设置 导出时在excel中排序 */
    public void setSort(int sort) {
        this.sort = sort;
    }

    /** 获取 导出到Excel中的名字 */
    public String getName() {
        return name;
    }

    /** 设置 导出到Excel中的名字 */
    public void setName(String name) {
        this.name = name;
    }

    /** 获取 日期格式, 如: yyyy-MM-dd */
    public String getDateFormat() {
        return dateFormat;
    }

    /** 设置 日期格式, 如: yyyy-MM-dd */
    public void setDateFormat(String dateFormat) {
        this.dateFormat = dateFormat;
    }

    /** 获取 如果是字典类型，请设置字典的type值 (如: sys_user_sex) */
    public String getDictType() {
        return dictType;
    }

    /** 设置 如果是字典类型，请设置字典的type值 (如: sys_user_sex) */
    public void setDictType(String dictType) {
        this.dictType = dictType;
    }

    /** 获取 读取内容转表达式 (如: 0=男,1=女,2=未知) */
    public String getReadConverterExp() {
        return readConverterExp;
    }

    /** 设置 读取内容转表达式 (如: 0=男,1=女,2=未知) */
    public void setReadConverterExp(String readConverterExp) {
        this.readConverterExp = readConverterExp;
    }

    /** 获取 分隔符,读取字符串组内容 */
    public String getSeparator() {
        return separator;
    }

    /** 设置 分隔符,读取字符串组内容 */
    public void setSeparator(String separator) {
        this.separator = separator;
    }

    /** 获取 BigDecimal 精度 默认: -1(默认不开启BigDecimal格式化) */
    public int getScale() {
        return scale;
    }

    /** 设置 BigDecimal 精度 默认: -1(默认不开启BigDecimal格式化) */
    public void setScale(int scale) {
        this.scale = scale;
    }

    /** 获取 BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN */
    public int getRoundingMode() {
        return roundingMode;
    }

    /** 设置 BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN */
    public void setRoundingMode(int roundingMode) {
        this.roundingMode = roundingMode;
    }

    /** 获取 导出类型(0数字 1字符串) */
    public ColumnType getCellType() {
        return cellType;
    }

    /** 设置 导出类型(0数字 1字符串) */
    public void setCellType(ColumnType cellType) {
        this.cellType = cellType;
    }

    /** 获取 导出时在excel中每个列的高度 单位为字符 */
    public double getHeight() {
        return height;
    }

    /** 设置 导出时在excel中每个列的高度 单位为字符 */
    public void setHeight(double height) {
        this.height = height;
    }

    /** 获取 导出时在excel中每个列的宽 单位为字符 */
    public double getWidth() {
        return width;
    }

    /** 设置 导出时在excel中每个列的宽 单位为字符 */
    public void setWidth(double width) {
        this.width = width;
    }

    /** 获取 文字后缀,如% 90 变成90% */
    public String getSuffix() {
        return suffix;
    }

    /** 设置 文字后缀,如% 90 变成90% */
    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    /** 获取 当值为空时,字段的默认值 */
    public String getDefaultValue() {
        return defaultValue;
    }

    /** 设置 当值为空时,字段的默认值 */
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

    /** 获取 提示信息 */
    public String getPrompt() {
        return prompt;
    }

    /** 设置 提示信息 */
    public void setPrompt(String prompt) {
        this.prompt = prompt;
    }

    /** 获取 设置只能选择不能输入的列内容. */
    public String[] getCombo() {
        return combo;
    }

    /** 设置 设置只能选择不能输入的列内容. */
    public void setCombo(String[] combo) {
        this.combo = combo;
    }

    /** 获取 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写 */
    public boolean getIsExport() {
        return isExport;
    }

    /** 设置 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写 */
    public void setExport(boolean isExport) {
        this.isExport = isExport;
    }

    /** 获取 另一个类中的属性名称,支持多级获取,以小数点隔开 */
    public String getTargetAttr() {
        return targetAttr;
    }

    /** 设置 另一个类中的属性名称,支持多级获取,以小数点隔开 */
    public void setTargetAttr(String targetAttr) {
        this.targetAttr = targetAttr;
    }

    /** 获取 是否自动统计数据,在最后追加一行统计数据总和 */
    public boolean getIsStatistics() {
        return isStatistics;
    }

    /** 设置 是否自动统计数据,在最后追加一行统计数据总和 */
    public void setStatistics(boolean isStatistics) {
        this.isStatistics = isStatistics;
    }

    /** 获取 字段类型(0:导出导入,1：仅导出,2:仅导入) */
    public Type getType() {
        return type;
    }

    /** 设置 字段类型(0:导出导入,1：仅导出,2:仅导入) */
    public void setType(Type type) {
        this.type = type;
    }

    /**
     * 构建SentinelResource
     * 
     * @return
     */
    public Excel build() {
        return new Excel() {

            /**
             * SentinelResource的Class对象
             */
            @SuppressWarnings("synthetic-access")
            @Override
            public Class<? extends Annotation> annotationType() {
                return CLA;
            }

            @Override
            public int sort() {
                return getSort();
            }

            @Override
            public String name() {
                return getName();
            }

            @Override
            public String dateFormat() {
                return getDateFormat();
            }

            @Override
            public String dictType() {
                return getDictType();
            }

            @Override
            public String readConverterExp() {
                return getReadConverterExp();
            }

            @Override
            public String separator() {
                return getSeparator();
            }

            @Override
            public int scale() {
                return getScale();
            }

            @Override
            public int roundingMode() {
                return getRoundingMode();
            }

            @Override
            public ColumnType cellType() {
                return getCellType();
            }

            @Override
            public double height() {
                return getHeight();
            }

            @Override
            public double width() {
                return getWidth();
            }

            @Override
            public String suffix() {
                return getSuffix();
            }

            @Override
            public String defaultValue() {
                return getDefaultValue();
            }

            @Override
            public String prompt() {
                return getPrompt();
            }

            @Override
            public String[] combo() {
                return getCombo();
            }

            @Override
            public boolean isExport() {
                return getIsExport();
            }

            @Override
            public String targetAttr() {
                return getTargetAttr();
            }

            @Override
            public boolean isStatistics() {
                return getIsStatistics();
            }

            @Override
            public Type type() {
                return getType();
            }
        };
    }

}